[毎日Kotlin] Day22. Conventions
はじめに
毎日Kotlinシリーズです。
このシリーズを初めての方はこちらです。「毎日Kotlin」はじめました
Conventionsの章について
この章ではOperator(演算子)がテーマの問題でした。毎日自分だけのオレオレ演算子ルールを作り、シンプルな演算子を組み合わせて他の演算子を実現したりしました。ハイライトで見ていきます。
- [毎日Kotlin] Day15. Comparison(演算子)
- [毎日Kotlin] Day16. In range
- [毎日Kotlin] Day17. Range to
- [毎日Kotlin] Day18. For loop(ループ処理)
- [毎日Kotlin] Day19. Operators overloading
- [毎日Kotlin] Day20. Destructuring declarations
- [毎日Kotlin] Day21. Invoke
Day 15-18のハイライト
Dateをテーマにしてましたが、ここで同様のOperatorをもっとシンプルなNumというIntをラップしただけのものでやってみます。
class Num(val value: Int)
Day15 - Day18までの一連の流れをつかむとオレオレ演算子ルールを作りやすくなるので何度か自分でつくってみよう。Day19は少し複雑になっていますが、流れは同じです。Day20とDay21は便利機能なので覚えておくと良いと思います。
各演算子毎にそれを処理するクラスをつくり、そのクラスに変換する流れになっています。
fun main() { val a = Num(1) val b = Num(10) a > b //day15で実現 Num(3) in NumRange(a, b) //day16で実現 Num(3) in a..b //day17で実現 for (num in a..b) { //day18で実現 } } class Num(val value: Int) { //Day15で実装 operator fun compareTo(b: Num): Int = b.value - value //Day17で実装 operator fun rangeTo(num: Num) = NumRange(this, num) } class NumRange(val start: Num, val end: Num) { //Day18で実装 operator fun iterator(): Iterator<Num> = NumIterator(this) //Day16で実装 operator fun contains(num: Num): Boolean = start <= num && num <= end } //Day18で実装 class NumIterator(val range: NumRange) : Iterator<Num> { var current = range.start override fun hasNext(): Boolean = current <= range.end override fun next(): Num { val result = current current = current.next() return result } private fun Num.next(): Num = Num(value + 1) }
あとがき
毎日やっている方はこうなっていることでしょう。
明日からはコレクションの章にはいっていきます!
Day23.でまたお会いしましょう。